<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>系统内置原型对象</h1>
    <ul>
        <li>Function：用于创建函数的构造方法。</li>
        <li>Array：用于创建数组的构造方法。</li>
        <li>String：用于创建字符串的构造方法，字符串值的包装类。</li>
        <li>Number：用于创建数值的构造方法，数值类型的包装类。</li>
        <li>Boolean：用于创建布尔值的构造方法，布尔值类型的包装类。</li>
    </ul>
    <h2>作业</h2>
    <dl>
        <dt>选做</dt>
        <dl>使用Object.defineProperty可以给属性设置拦截器。思考：如果拦截数组索引处值的变化。</dl>
    </dl>
    <script>
        function sum(a,b) {
            return a + b;
        }
        // 实际上，所有的函数都是使用下面的构造方法生成的。
        let sum2 = new Function('a','b','return a + b;');
        console.log(sum2(1,1)); // 2

        console.log(sum.__proto__ === Function.prototype); // true
        console.log(Function.prototype.__proto__ === Object.prototype); // true，Object.prototype是所有原型的终点

        let arr = new Array();
        console.log(Array.prototype.__proto__ === Object.prototype); // true

        let str = "123";
        console.log("str.__proto__ === String.prototype",str.__proto__ === String.prototype);

        let n = 123;
        console.log("n.__proto__ === Number.prototype",n.__proto__ === Number.prototype);

        arr[0] = 1;
        arr[1] = 2;

        let keys = Object.keys(arr);
        console.log(keys);
    </script>
</body>
</html>